package xin.javashare.designPattern.creation.singleton;

import java.io.ObjectStreamException;

/**
 * 使用静态内置类实现单例模式，解决非线程安全问题
 * JVM内部的机制能够保证当一个类被加载的时候，这个类的加载过程是线程互斥的
 * 但是，如果在构造函数中抛出异常，实例将永远得不到创建，也会出错
 */
public class StaticInnerClassSingleton {
    //但如果遇到序列化对象时，使用默认的方式运行得到的结果还是多例的。解决办法就是在反序列化时使用readResolve()方法。
    private static final long serialVersionUID = 888L;
    // 静态内部类，维护单例
    private static class StaticInnerClassSingletonHandler {
        private static StaticInnerClassSingleton singleton = new StaticInnerClassSingleton();
    }
    // 私有构造方法，防止实例化
    private StaticInnerClassSingleton(){}

    // 私有静态方法，获取实例。类加载时调用，只调用一次
    private static StaticInnerClassSingleton getInstance() {
        return StaticInnerClassSingletonHandler.singleton;
    }

    //但如果遇到序列化对象时，使用默认的方式运行得到的结果还是多例的。解决办法就是在反序列化时使用readResolve()方法。
    protected Object readResolve() throws ObjectStreamException {
        return StaticInnerClassSingletonHandler.singleton;
    }
}
